package com.szy.system.data.jpa;

import com.szy.system.api.page.SzyPage;
import com.szy.system.api.result.Result;
import com.szy.system.api.result.ResultUtils;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import java.util.List;

/**
 * @author : zhenyun.su
 * @comment : 返回SzyPage, Pageable, Sort, Result
 *
 * PI = "pi";  第几页的请求参数名称
 * PS = "ps";  每页记录数的请求参数名称
 * PAGE_INDEX_OFFSET = 0;  前端和后端第一页值由可能不同，通过偏移量使前后保持一致
 *     比如spring-data-jpa 默认0为第一页， 前端认为 1为第一页，则偏移量为1
 * PAGE_DEFAULT_INDEX = 0;  指定第几页， spring-data-jpa 默认0为第一页
 * PAGE_DEFAULT_SIZE = 10;  每页记录数
 * @since : 2020-8-15
 */

@Deprecated
public final class SzyJpaUtils {
    public static final String PI = "pi";
    public static final String PS = "ps";
    public static final Integer PAGE_DEFAULT_INDEX_OFFSET = 1;
    public static final Integer PAGE_DEFAULT_INDEX = 0;
    public static final Integer PAGE_DEFAULT_SIZE = 10;

    /**
     * @comment : 返回 自定义分页属性 SzyPage
     * @param：
     * pageIndex 第几页，空取默认值
     * pageSize  每页记录数，空取默认值
     */
    public static SzyPage getSzyPage(Integer pageIndex, Integer pageSize) {
        SzyPage page = new SzyPage();

        if (pageIndex != null && pageIndex >= 1) {
            page.setIndex(pageIndex - PAGE_DEFAULT_INDEX_OFFSET);
        } else {
            page.setIndex(PAGE_DEFAULT_INDEX);
        }
        if (pageSize != null && pageSize >= 1) {
            page.setSize(pageSize);
        } else {
            page.setSize(PAGE_DEFAULT_SIZE);
        }
        return page;
    }

    /**
     * @comment : 返回 分页对象 Pageable
     */
    public static Pageable getPageable(Sort.Direction direction, String... properties) {
        Sort sort = getSort(direction, properties);
        return PageRequest.of(PAGE_DEFAULT_INDEX, PAGE_DEFAULT_SIZE, sort);
    }
    /**
     * @comment : 返回 分页对象 Pageable
     */
    public static Pageable getPageable(SzyPage szyPage, Sort.Direction direction, String... properties) {
        Sort sort = getSort(direction, properties);
        return PageRequest.of(szyPage.getIndex(), szyPage.getSize(), sort);
    }

    public static Pageable getDefaultPageable(SzyPage szyPage) {
        Sort sort = getSort(Sort.Direction.DESC, "createdDate");
        return PageRequest.of(szyPage.getIndex(), szyPage.getSize(), sort);
    }

    /**
     * @comment : 返回 排序对象 Sort
     */
    public static Sort getSort(Sort.Direction direction, String... properties) {
        return Sort.by(direction, properties);
    }

    public static Sort getDefaultSort() {
        return getSort(Sort.Direction.DESC, "createdDate");
    }

    /**
     * @comment : 返回 Result
     */
    public static <T> Result<List<T>> getSuccessResult(List<T> data) {
        return ResultUtils.success(data);
    }

    public static <T> Result<T> getSuccessResult(T data) {
        return ResultUtils.success(data);
    }

    public static <T> Result<T> getFailureResult(T data) {
        return ResultUtils.failure(data);
    }


}
